# -*- coding: utf-8 -*-
'''
Created on Nov 21, 2009

@author: ebpoletto
'''
from django.shortcuts import render_to_response,HttpResponse
from django.template import RequestContext
from metodologia.models import *
import math

# Variaveis globais
numero_estacoes = [] # numero total de estacoes de trabalho em cada ano
numero_thin = [] # numero de estacoes thin em cada ano
numero_estacoes_novas = [] # numero de estacoes com a nova configuracao em cada ano

capacidade_datacenter = [] # capacidade de processamento do datacenter em MOPS em cada ano
numero_servidores_antigos = [] # numero de servidores antigos em cada ano
novos_servidores = [] # numero de servidores com a nova configuracao em cada ano

volume_dados = [] # quantidade de dados a serem armazenados em cada ano

# Todos os custos em US$
custo_energia_datacenter = [] # gasto com energia no datacenter em cada ano
custo_energia_amb_trabalho = [] # gasto com energia no amb. de trabalho em cada ano
custo_energia_armazenamento = [] # gasto com energia para o armazenamento de dados
custo_equipamento = [] # gasto com novos equipamentos em cada ano
custo_servidores = [] # gasto com novos servidores em cada ano
custo_workstations = [] # gasto com novas workstations em cada ano
custo_thin = [] # gasto com thin clients em cada ano
custo_total = [] # custo total com a solução para cada ano
grand_total = 0 # somatoria do custo total em todos os anos do horizonte

def gera_solucao(request):
    if request.method == 'POST':
        if 'solucao' in request.POST and 'ambtrab' in request.POST and 'datacenter' in request.POST:
            message = 'Form correct: %r' % request.POST['solucao']
        else:
            message = 'You submitted an empty form.'
            return HttpResponse(message)
        # Pegando a solucao
        solucao = Solucao.objects.get(id=request.POST['solucao'])
        # Pegando o Ambiente de Trabalho
        amb_trab = AmbienteTrabalho.objects.get(id=request.POST['ambtrab'])
        # Pegando o Datacenter
        datacenter= Datacenter.objects.get(id=request.POST['datacenter'])
    
    horizonte_temporal = solucao.horizonte+1 # Assim o horizonte pega um ano a mais, já que conta desde o ano 0, como início.
    
    """
        Calculo do Ambiente de Trabalho
    """
    numero_estacoes = [float(amb_trab.numero_estacoes_inicial)]    
    numero_thin = [float(0)]
    numero_estacoes_novas = [float(0)]
    
    for i in range(horizonte_temporal):
        if i != 0:
            numero_estacoes.append(float( (1.0+float(solucao.taxa_aum_workstation)) * float(numero_estacoes[i-1]) ) )
            numero_thin.append(float( float(numero_estacoes[i])*float(solucao.meta_thin) ))
            numero_estacoes_novas.append(float( float(numero_estacoes[i])-(float(numero_thin[i])+float(amb_trab.numero_estacoes_inicial)*(1.0-float(solucao.taxa_desat_workstation))**i) ))
    
    
    """
        Calculo do Datacenter
    """
    capacidade_datacenter = [float(datacenter.numero_servidores_inicial*datacenter.servidor.performance*datacenter.capacidade_utilizada)]
    numero_servidores_antigos = [float( datacenter.numero_servidores_inicial )]
    novos_servidores =[0]
    
    for i in range(horizonte_temporal):
        if i != 0:
            capacidade_datacenter.append(float(float(capacidade_datacenter[i-1])*(1.0+float(solucao.taxa_aum_processamento))))
            numero_servidores_antigos.append(float(float(numero_servidores_antigos[i-1])*(1.0-float(solucao.taxa_desat_servidor))))
            # valor é atualizado
    for i in range(horizonte_temporal):
            if i != 0:
                capacidade_datacenter[i] = float( float(capacidade_datacenter[i])+float(numero_thin[i])*float(solucao.impacto_thin) )
            
    if solucao.uso_virtualizacao == 'V':
        for i in range(horizonte_temporal):
            if i != 0:
                novos_servidores.append(float(float(novos_servidores[i-1])+(float(capacidade_datacenter[i])-float(numero_servidores_antigos[i])*float(datacenter.servidor.performance)*0.8-float(novos_servidores[i-1])*float(solucao.servidor_novo.performance)*0.8)/(float(solucao.servidor_novo.performance)*0.8)))
    elif solucao.uso_virtualizacao == 'NV':
        for i in range(horizonte_temporal):
            if i != 0:
                novos_servidores.append(float(float(novos_servidores[i-1])+(float(capacidade_datacenter[i])-float(numero_servidores_antigos[i])*float(datacenter.servidor.performance)*0.4-float(novos_servidores[i-1])*float(solucao.servidor_novo.performance)*float(datacenter.capacidade_utilizada))/(float(solucao.servidor_novo.performance)*float(datacenter.capacidade_utilizada))))
    """
        Calcula o custo
    """
    # calculo do gasto com energia para o armazenamento de dados
    volume_dados = [float(datacenter.dados_inicial)]
    custo_energia_armazenamento = [float( float(solucao.custo_kwh)*(float(datacenter.percentual_tape)*float(volume_dados[0])*1.16+float(solucao.custo_kwh)*(1.0-float(datacenter.percentual_tape))*float(volume_dados[0])*98.0) )]
    
    for i in range(horizonte_temporal):
        if i != 0:
            volume_dados.append(float(float(volume_dados[i-1])*(1.0+float(solucao.taxa_aum_dados))))
            
    for i in range(horizonte_temporal):
        if i != 0:
            custo_energia_armazenamento.append(float(float(volume_dados[i])*float(solucao.custo_kwh)*(float(solucao.meta_tape)*1.16+(1.0-float(solucao.meta_tape))*98.0)))
            
    # calculo do gasto com energia no datacenter, supondo consumo do servidor em W, operando todos os dias da semana e 24 horas por dia
    custo_energia_datacenter = []
    for i in range(horizonte_temporal):
        custo_energia_datacenter.append(float(float(solucao.custo_kwh)*7.0/7.0*365*24*(float(novos_servidores[i])*float(solucao.servidor_novo.consumo_estimado)+float(numero_servidores_antigos[i])*float(datacenter.servidor.consumo_estimado))/1000.0))
    
    # calculo do gasto com energia no ambiente de trabalho, supondo consumo da workstation em W, operando 5 dias por semana e 9 horas por dia . o consumo dos thin clients foi fixado em 40W
    custo_energia_amb_trabalho = []
    for i in range(horizonte_temporal):
        custo_energia_amb_trabalho.append(float(float(solucao.custo_kwh)*5.0/7.0*365*9.0*(float(numero_estacoes_novas[i])*float(solucao.workstation_novo.consumo_estimado)+float(numero_thin[i])*40+(float(numero_estacoes[i])-float(numero_estacoes_novas[i]))*float(amb_trab.workstation.consumo_estimado))/1000))
        
    # calculo do custo dos servidores no datacenter
    custo_servidores = [float(0)]
    for i in range(horizonte_temporal):
        if i != 0:
            custo_servidores.append(float((float(novos_servidores[i])-float(novos_servidores[i-1]))*float(solucao.servidor_novo.custo)))
    
    # calculo do custo dos thin clients
    custo_thin = [0]
    for i in range(horizonte_temporal):
        if i != 0:
            custo_thin.append(float((float(numero_thin[i])-float(numero_thin[i-1]))*250.0))
            
    # calculo do custo das workstations
    custo_workstations = [0]
    for i in range(horizonte_temporal):
        if i != 0:
            custo_workstations.append(float((float(numero_estacoes_novas[i])-float(numero_estacoes_novas[i-1]))*float(solucao.workstation_novo.custo)))
    
    # calculo do custo total com equipamento
    custo_equipamento = []
    for i in range(horizonte_temporal):
        custo_equipamento.append(float(float(custo_servidores[i])+float(custo_thin[i])+float(custo_workstations[i])))
    
    # calculo do custo total da solução
    custo_total = []
    
    if solucao.uso_virtualizacao=='NV':
        custo_total.append(float(float(custo_equipamento[0])+float(custo_energia_armazenamento[0])+float(custo_energia_datacenter[0])+float(custo_energia_amb_trabalho[0])))
    elif solucao.uso_virtualizacao=='V':
        custo_total.append(float(20000.0+float(custo_equipamento[0])+float(custo_energia_armazenamento[0])+float(custo_energia_datacenter[0])+float(custo_energia_amb_trabalho[0])))
                              
    for i in range(horizonte_temporal):
        if i != 0:
            custo_total.append(float(float(custo_equipamento[i])+float(custo_energia_armazenamento[i])+float(custo_energia_datacenter[i])+float(custo_energia_amb_trabalho[i])))
    
    grand_total = 0
    
    for i in range(horizonte_temporal):
        grand_total = float(float(grand_total) + float(custo_total[i]))
        
    return render_to_response('metodologia/mostra_solucao.html', # template a ser criado depois
                              locals(), # envia para o template todas as variáveis setadas aqui
                              context_instance=RequestContext(request))
    
def escolhe_solucao(request):
    datacenters = Datacenter.objects.all()
    ambtrabs = AmbienteTrabalho.objects.all()
    solucoes = Solucao.objects.all()
    return render_to_response('metodologia/escolhe_solucao.html', # template a ser criado depois
                              locals(), # envia para o template todas as variáveis setadas aqui
                              context_instance=RequestContext(request))
    
def lista_componentes(request, classe):
    if classe == 'componentes':
        processadores = Processador.objects.all()[:50]
        memorias = Memoria.objects.all()[:50]
    elif classe == 'computadores':
        servidores = Computador.objects.filter(tipo='S')[:20]
        workstations = Computador.objects.filter(tipo='W')[:20]
    elif classe == 'datacenter':
        datacenters = Datacenter.objects.all()[:20]
    elif classe == 'ambtrab':
        ambtrabs = AmbienteTrabalho.objects.all()[:20]
    elif classe == 'solucao':
        solucoes = Solucao.objects.all()[:20]
    return render_to_response('metodologia/lista_'+classe+'.html', # template a ser criado depois
                              locals(), # envia para o template todas as variáveis setadas aqui
                              context_instance=RequestContext(request))
    
def gera_menu(request):
    return render_to_response('metodologia/programa.html', # template a ser criado depois
                              locals(), # envia para o template todas as variáveis setadas aqui
                              context_instance=RequestContext(request))